#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include "tp2.h"

  /* 
   * Verifica se dois titulos de obra sao iguais. Se 'a' vier alfabeticamente
   * antes que 'b' ela retorna TRUE. Se 'b' vier antes de 'a' ela  retorna
   * FALSE. Se forem iguais, retorna SAME.
   */
  int VerificaIdent(char *a, char *b){
    int i=0;
    for(i=0;i<200;i++){
      if(a[i]>b[i]){
        return FALSE;
      }
      if(a[i]<b[i]){
        return TRUE;
      }
    }
    return SAME;
  }

  /* 
   * Funcao recusiva que faz a busca binaria pela chave primaria de
   * uma obra que se deseja procurar.
   */
  apPK BSearch(PK *lista,char *busca,int inicio,int fim){
    int meio=(inicio+fim)/2,i;
    i=VerificaIdent(lista[meio].titulo,busca);
    if(i==SAME){
      return &lista[meio];
    }
    if(meio==fim-1){
      i=VerificaIdent(lista[fim].titulo,busca);
      if(i!=SAME){
        return NULL;
      }
      else{
        return &lista[fim];
      }
    }
    if(meio==inicio){
      return NULL;
    }
    if(i==TRUE){
      return BSearch(lista,busca,meio,fim);
    }
    else{
      return BSearch(lista,busca,inicio,meio);
    }
  }

  /*
   * Funcao principal que faz a busca por uma obra.
   */
  int Busca(PK *lista,int tam){
    char busca[200],found[451],c;
    apPK reg;
    int i=0,a;
    FILE *arq;
    dados html;
    arq=fopen("base20.dat","r");
  /*
   * Leitura do titulo da obra que se deseja pesquisar. Caso
   * o usuario digite um titulo com mais de 200 caracteres,
   * eh mostrada uma mensagem de erro. Se tiver menos
   * de 200 caracteres, eh completado com espacos.
   */
    scanf("%c",&c);
    while(c!='\n'){
      busca[i]=c;
      i++;
      if(i==200){
        printf("O titulo deve conter no maximo 200 caracteres.\n");
        i=0;
      }
      scanf("%c",&c);
    }
    while(i<200){
      busca[i]=' ';
      i++;
    }
    reg = BSearch(lista,busca,0,tam-1);
    if(reg==NULL){
      printf("Nenhum registro encontrado.\n");
    }
  /*
   * Se for encontrada a obra, seus dados sao gravados
   * em um vetor de forma a facilitar o trabalho da
   * funcao ADDhtml.
   */
    if(reg!=NULL){
      fseek(arq,reg->NRR*450,0);
      fread(found,1,450,arq);
      html=(dados)malloc(sizeof(struct dados));
      for(a=0;a<200;a++){
        html->nomes[a]=found[a];
      }
      for(a=0;a<100;a++){
        html->tipos[a]=found[200+a];
      }
      for(a=0;a<125;a++){
        html->autors[a]=found[300+a];
      }
      for(a=0;a<4;a++){
        html->anos[a]=found[425+a];
      }
      for(a=0;a<12;a++){
        html->valors[a]=found[429+a];
      }
      for(a=0;a<6;a++){
        html->imagems[a]=found[441+a];
      }
      html->imagems[6]='.';
      for(a=6;a<9;a++){
        html->imagems[a+1]=found[441+a];
      }
      ADDhtml(html);
    }
    fclose(arq);
    return TRUE;
  }
